package org.study.swing.study01.menu;

import lombok.extern.slf4j.Slf4j;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * 下拉式菜单。参考 https://blog.csdn.net/hitmengfanchao/article/details/137032259
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2024年11月11日
 */
@Slf4j
public class MenuFrame01 extends JFrame implements ActionListener, ItemListener {
    public static void main(String[] args) {
        new MenuFrame01();
    }

    // 菜单栏
    private JMenuBar menuBar;
    // 菜单、子菜单
    private JMenu menu, subMenu;
    // 菜单项
    private JMenuItem menuItem;
    // 复选菜单项
    private JCheckBoxMenuItem checkBoxMenuItem;
    // 单项菜单项
    private JRadioButtonMenuItem radioButtonMenuItem;
    // 文本框
    private JTextField textField;

    public MenuFrame01() {
        super.setTitle("下拉式菜单示例");
        super.setSize(600, 400);
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 将窗口居中显示在屏幕上
        super.setLocationRelativeTo(null);
        // 创建菜单栏
        menuBar = new JMenuBar();
        // 将菜单栏加入到窗口上
        super.setJMenuBar(menuBar);
        // 创建文File菜单
        menu = new JMenu("File");
        // 设置快捷键（ALt+F）
        menu.setMnemonic(KeyEvent.VK_F);
        menuBar.add(menu);

        // 创建File菜单的New子菜单
        subMenu = new JMenu("New");
        menu.add(subMenu);

        // 创建Java Project菜单项
        menuItem = new JMenuItem("Java Project", KeyEvent.VK_J);
        // 快捷键（Ctrl+J）
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, ActionEvent.CTRL_MASK));
        // 注册ActionListener事件监听器
        menuItem.addActionListener(this);
        // 添加到New菜单上
        subMenu.add(menuItem);

        // 创建Web Project菜单项
        menuItem = new JMenuItem("Web Project");
        // 快捷键（Ctrl+D）
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK));
        // 注册ActionListener事件监听器
        menuItem.addActionListener(this);
        // 添加到New菜单上
        subMenu.add(menuItem);

        // 创建Open菜单项
        menuItem = new JMenuItem("Open");
        // 快捷键（Ctrl+O）
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
        // 注册ActionListener事件监听器
        menuItem.addActionListener(this);
        // 添加到File菜单上
        menu.add(menuItem);

        // 创建File菜单的Exit菜单项
        menuItem = new JMenuItem("Exit");
        // 快捷键（Ctrl+E）
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.CTRL_MASK));
        // 注册ActionListener事件监听器
        menuItem.addActionListener(this);
        menu.add(menuItem);

        // 创建文Edit菜单
        menu = new JMenu("Edit");
        menu.setMnemonic(KeyEvent.VK_E);
        menuBar.add(menu);

        // 创建Undo菜单项
        menuItem = new JMenuItem("Undo");
        // 添加到Edit菜单上
        menu.add(menuItem);

        // 创建Redo菜单项
        menuItem = new JMenuItem("Redo");
        // 添加到Edit菜单上
        menu.add(menuItem);
        // 加入分割线
        menu.addSeparator();

        // 创建复选菜单项
        checkBoxMenuItem = new JCheckBoxMenuItem("Smart Insert Mode");
        // 注册ItemListener事件监听器
        checkBoxMenuItem.addItemListener(this);
        // 添加到Edit菜单上
        menu.add(checkBoxMenuItem);
        // 加入分割线
        menu.addSeparator();

        // 创建单项菜单项
        // 创建按钮组
        ButtonGroup group = new ButtonGroup();
        radioButtonMenuItem = new JRadioButtonMenuItem("Small");
        // 注册ItemListener事件监听器
        radioButtonMenuItem.addItemListener(this);
        // 添加到Edit菜单上
        menu.add(radioButtonMenuItem);
        // 添加到按钮组中
        group.add(radioButtonMenuItem);

        radioButtonMenuItem = new JRadioButtonMenuItem("Large");
        // 注册ItemListener事件监听器
        radioButtonMenuItem.addItemListener(this);
        // 添加到Edit菜单上
        menu.add(radioButtonMenuItem);
        // 添加到按钮组中
        group.add(radioButtonMenuItem);

        textField = new JTextField();
        super.add(textField, BorderLayout.SOUTH);
        super.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        textField.setText(command);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        JMenuItem menuItem = (JMenuItem) e.getSource();
        String command = menuItem.getText();
        int state = e.getStateChange();
        if (state == ItemEvent.SELECTED) {
            command += " SELECTED";
        } else if (state == ItemEvent.DESELECTED) {
            command += " DESELECTED";
        }
        textField.setText(command);
    }
}
